package com.rpcservice.rpc.remoting.transport.netty.client;

import com.esotericsoftware.minlog.Log;
import io.netty.channel.Channel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.InetSocketAddress;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 存储和提供 Channel 对象的工具类（netty框架）
 * 用于管理和获取与服务器的网络连接通道
 * 提供了一种机制来存储和获取与服务器的网络连接通道，
 * 以便在应用程序中进行网络通信。
 * 它通常用于管理多个客户端连接或与多个服务器的连接。
 * 这个类可以被设计为单例模式，以确保只有一个实例存在于整个应用程序中。
 */
public class ChannelProvider {
    private static final Logger logger = LoggerFactory.getLogger(ChannelProvider.class);
    private final Map<String, Channel> channelMap;

    public ChannelProvider() {
        this.channelMap = new ConcurrentHashMap<>();
    }

    public Channel get(InetSocketAddress address) {
        String key = address.toString();
        //确定是否存在相应地址的连接
        if (channelMap.containsKey(key)) {
            Channel channel = channelMap.get(key);
            // 如果是，请确定连接是否可用，如果是，请直接获取通道
            if (channel != null && channel.isActive()) {
                return channel;
            } else {
                // 如果通道不可用或不存在，请从映射中删除该通道
                channelMap.remove(key);
            }
        }
        return null;
    }

    public void set(InetSocketAddress address, Channel channel) {
        String key = address.toString();
        channelMap.put(key, channel);
        logger.info("set after Channel map size :[{}]", channelMap.size());
    }

    public void remove(InetSocketAddress address) {
        String key = address.toString();
        channelMap.remove(key);
        logger.info("remove after Channel map size :[{}]", channelMap.size());
    }
}
